//
//  QBStatusViewModel.swift
//  Wei91BoiOS
//
//  Created by bing on 16/3/25.
//  Copyright © 2016年 bing. All rights reserved.
//

import UIKit

import SDWebImage

class QBStatusViewModel: NSObject {

    // 单例
    static let sharedInstance: QBStatusViewModel = QBStatusViewModel()
    
    /// 1.是否加载微博数据
    private var loading: Bool = false
    /**
    *  加载微博数据
        调用网络数据请求 API:https://api.weibo.com/2/statuses/home_timeline.json
     
     since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
     max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
   */
    
    func loadStatus(since_id: Int64, max_id: Int64,loadStatusCallback: (statuses: [QBStatus]?, error: NSError?) -> ()) {
        // 2.判断是否有人在加载微博数据
        if loading {
            
            QBPrint(msg: "有人正在加载数据")
            
            return
        }
        
        // 3.之前没有人加载微博数据
        loading = true
        
        // url
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        // 请求参数
//        var parameters: [String: AnyObject] = ["access_token":QBUserAccountViewModel.sharedInstance.userAccount!.access_token!]
        var parameters = [String: AnyObject]()
        
        
        // 表示别人传递了since_id需要下拉刷新，返回比since_id大的微博
        // 注意： 字典里面的key不能直接传递Int64
        if since_id > 0 {
            parameters["since_id"] = NSNumber(longLong: since_id)

        } else if max_id > 0 {
            // 别人传递了max_id,添加到字典里,此处 max_id - 1 防止数据重复
            parameters["max_id"] = NSNumber(longLong: max_id - 1)
        }
        
        //parameters["count"] = 2
        
        // 发送网络请求
        QBNetworkTool.shardIntance.requestGET(urlString, parameters: parameters) { (result, error) -> () in
            
            // 4.微博数据加载完成,将loading改成false,以便再次可以调用
            self.loading = false
            
            if error != nil {
                QBPrint(msg: "请求微博数据出现了错误：\(error)")
                // 告诉调用的人，有人正在加载微博数据
                // 自定义错误
                // code ：自定义，错误的类型
                // userInfo:错误的附加类型
                
//                let error = NSError(domain: "cn.bing.error.net.status", code: -1, userInfo: ["errorDescription" : "嘿！哥们不要刷新的那么快，重复刷新了"])
                loadStatusCallback(statuses: nil, error: QBNetworkToolError.RepeatRefresh.error())
                
                return
            }
            
            // 没有出错,解析返回的数据中的 "statuses", statuses里面对应的是所有的微博数据
            let statusArray = result?["statuses"] as? [[String: AnyObject]]
            
            // 定义空数组来存放微博模型
            var statuses = [QBStatus]()
            
            // 遍历微博字典数组
            for dict in statusArray! {
                
                let status = QBStatus(dict: dict)
                
                statuses.append(status)
            }
            
            //QBPrint(msg: "获取微博数据: \(statuses)")

            self.cacheWebImage(statuses, loadStatusCallback: loadStatusCallback)
        }
    }
    
    
    
    /// 缓存图片
    private func cacheWebImage(statuses: [QBStatus],loadStatusCallback:(statuses: [QBStatus]?, error: NSError?)-> ()) {
        
        // 创建grounp
        let group = dispatch_group_create()
        
        var length: CGFloat = 0
        
        // 查找微博里面的图片，下载下来
        for status in statuses {
            var downloadURLs = status.storePictureURLs
            
            // 如果原唱没有，找转发的微博
            if downloadURLs == nil {
                downloadURLs = status.retweeted_status?.storePictureURLs
            }
            
            if downloadURLs == nil {
                
                // 说明原创没有图片，被转发的也没有图片
                continue
            }
            
            // 能到下面来说明有图片需要下载，不管微博模型里面有几张图片都缓存，会导致缓存图片时间太长
            // 只需要缓存一张图片，多张图片的不需要管，可要在cell即将显示的时候SDWebImage会自己去下载
            if downloadURLs?.count == 1 {
                let url = downloadURLs![0]
                // 使用SDWebImage下载图片,downloadImageWithURL是异步的方法,会将下载的图片保存在沙盒中,图片的名称是urlString MD5编码
                // 在异步任务之前进入组
                dispatch_group_enter(group)
                
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    
                    // SDWebImage下载完成图片的时候的回调
                    // 不管是下载成功还是失败,任务都完成了.就需要离开组
                    dispatch_group_leave(group)
                    
                    if error != nil {
                        
                        //QBPrint(msg: "SDWebImageManager下载图片失败: \(url)")
                        
                        return
                    }
                   // QBPrint(msg: "下载图片成功了：\(url)")
                    
                    let data = UIImagePNGRepresentation(image)!
                    length += CGFloat(data.length)
                })
            }
            
        }
        // 所有模型的图片都下载完成才通知
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            
            let len = length / 1024 / 1024.0
            
            let l = String(format: "%.2f", arguments: [len])
            //print("所有图片都缓存完成: \(l) MB")
            
            // 所有图片都缓存完成，通知控制器显示微博数据
            loadStatusCallback(statuses: statuses, error: nil)
        }
    }
    
    
    func sendStatus(status: String, image: UIImage?, sendStatusCallback: (error: NSError?) -> ()) {
        
        guard let access_token = QBUserAccountViewModel.sharedInstance.userAccount?.access_token else {
            sendStatusCallback(error: QBNetworkToolError.EmptyAccessToken.error())
            return
        }
        
        let parameters = [
            "access_token" : access_token,
            "status" : status
        ]
        
        if image == nil {
            
            // url
            let urlString = "https://api.weibo.com/2/statuses/update.json"
            
            
            QBNetworkTool.shardIntance.requestPOST(urlString, parameters: parameters) { (result, error) -> () in
                
                if error != nil {
                    sendStatusCallback(error: error)
                    return
                }
                // 发布微博成功
                sendStatusCallback(error: nil)
            }
        } else {
            // 发送的是带图片的微博
            let url = "https://upload.api.weibo.com/2/statuses/upload.json"
            
            QBNetworkTool.shardIntance.requestPOST(url, parameters: parameters, constructingBodyWithBlock: { (formdata) -> Void in
                
                // 上传图片
                // data: NSData: 要上传的2进制
                // name: 查看api,文件上传的请求参数
                // fileName: 上传到服务器的名称,查看api.如果api没有规定随便写(服务器自己会去做重命名),如果有规定需要按照规定来
                // mimeType: 文件的类型: image/gif, image/png, image/jpeg
                
                // 将图片转成而二进制
                let data = UIImagePNGRepresentation(image!)!
                
                formdata.appendPartWithFileData(data, name: "pic", fileName: "abc.png", mimeType: "image/png")
                
                }, requestCallback: { (result, error) -> () in
                    
                    if error != nil {
                        // 出现错误
                        sendStatusCallback(error: error)
                        return
                    }
                    
                    // 没有错误
                    sendStatusCallback(error: nil)
            })
        }
        
    }
}
